本文目录一览:
- 1、spring中怎么实现过滤器和监听器?
- 2、SpringMVC如何有效的防止XSS注入?
- 3、Spring MVC 如何防止XSS、SQL注入攻击
- 4、spring mvc 注解怎么连接所有进入controler的请求并过滤其中的xss
- 5、使用springboot怎么添加一个filter过滤器
spring中怎么实现过滤器和监听器?
1、延迟加载过滤器
Hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。
Spring 为此专门提供了一个 OpenSessionInViewFilter 过滤器,它的主要功能是使每个请求过程绑定一个 Hibernate Session,即使最初的事务已经完成了,也可以在 Web 层进行延迟加载的操作。
filter
filter-namehibernateFilter/filter-name
filter-class
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
/filter-class
/filter
filter-mapping
filter-namehibernateFilter/filter-name
url-pattern*.html/url-pattern
/filter-mapping
2、乱码过滤器
对post乱码的处理,如下
filter
filter-nameencodingFilter/filter-name
filter-class
org.springframework.web.filter.CharacterEncodingFilter ① Spring 编辑过滤器
/filter-class
init-param ② 编码方式
param-nameencoding/param-name
param-valueUTF-8/param-value
/init-param
init-param ③ 强制进行编码转换
param-nameforceEncoding/param-name
param-valuetrue/param-value
/init-param
/filter
filter-mapping ② 过滤器的匹配 URL
filter-nameencodingFilter/filter-name
url-pattern*.html/url-pattern
/filter-mapping
3、请求跟踪日志过滤器
程度调试者可以详细地查看到有哪些请求被调用,请求的参数是什么,请求是否正确返回等信息,需要将log4j设为debug
org.springframework.web.filter.ServletContextRequestLoggingFilter: 该过滤器将请求的 URI 记录到 Common 日志中
4、WebAppRootListener
可以将 Web 应用根目录添加到系统参数中,对应的属性名可以通过名为“webAppRootKey”的 Servlet 上下文参数指定,默认为“webapp.root”,配置如下
context-param
param-namewebAppRootKey/param-name
param-valuebaobaotao.root/param-value ① Web 应用根目录以该属性名添加到系统参数中
/context-param
…
② 负责将 Web 应用根目录以 webAppRootKey 上下文参数指定的属性名添加到系统参数中
listener
listener-class
org.springframework.web.util.WebAppRootListener
/listener-class
/listener
5、Log4jConfigListener 监听器
包括了 WebAppRootListener 的功能,也就是说,Log4jConfigListener 会自动完成将 Web 应用根目录以 webAppRootKey 上下文参数指定的属性名添加到系统参数中,在log4j.xml可以直接使用
6、Introspector 缓存清除监听器
负责处理由 JavaBean Introspector 功能而引起的缓存泄露。IntrospectorCleanupListener 监听器在 Web 应用关闭的时会负责清除 JavaBean Introspector 的缓存,在 web.xml 中注册这个监听器可以保证在 Web 应用关闭的时候释放与其相关的 ClassLoader 的缓存和类引用。
SpringMVC如何有效的防止XSS注入?
在数据进入数据库之前对非法字符进行转义,在更新和显示的时候将非法字符还原
在显示的时候对非法字符进行转义
如果项目还处在起步阶段,建议使用第二种,直接使用jstl的c:out标签即可解决非法字符的问题。当然,对于Javascript还需要自己处理一下,写一个方法,在解析从服务器端获取的数据时执行以下escapeHTML()即可。
附:Javascript方法:
String.prototype.escapeHTML = function () {
return this.replace(//g, ‘’).replace(//g, ‘’).replace(//g, ‘’).replace(/”/g, ‘"’);}
如果项目已经开发完成了,又不想大批量改动页面的话,可以采用第一种方法,此时需要借助Spring MVC的@InitBinder以及org.apache.commons.lang.PropertyEditorSupport、org.apache.commons.lang.StringEscapeUtils
public class StringEscapeEditor extends PropertyEditorSupport {
private boolean escapeHTML;
private boolean escapeJavaScript;
private boolean escapeSQL;
public StringEscapeEditor() { super(); }
public StringEscapeEditor(boolean escapeHTML, boolean escapeJavaScript, boolean escapeSQL) {super();this.escapeHTML = escapeHTML;
this.escapeJavaScript = escapeJavaScript;
this.escapeSQL = escapeSQL;}@Overridepublic void setAsText(String text) {
if (text == null) {
setValue(null);} else {String value = text;
if (escapeHTML) { value = StringEscapeUtils.escapeHtml(value); }
if (escapeJavaScript) { value = StringEscapeUtils.escapeJavaScript(value); }
if (escapeSQL) { value = StringEscapeUtils.escapeSql(value); } setValue(value); }}@Overridepublic String getAsText() { Object value = getValue(); return value != null ? value.toString() : “”; }}
在上面我们做了一个EscapeEditor,下面还要将这个Editor和Spring的Controller绑定,使服务器端接收到数据之后能够自动转移特殊字符。
下面我们在@Controller中注册@InitBinder
@InitBinder
public void initBinder(WebDataBinder binder) {
这个方法可以直接放到abstract Controller类中,这样子每个Controller实例都能够拥有该方法。
Spring MVC 如何防止XSS、SQL注入攻击
在数据进入数据库之前对非法字符进行转义,在更新和显示的时候将非法字符还原 在显示的时候对非法字符进行转义 如果项目还处在起步阶段,建议使用第二种,直接使用jstl的c:out标签即可解决非法字符的问题。当然,对于Javascript还需要自己处理一下,写一个方法,在解析从服务器端获取的数据时执行以下escapeHTML()即可。 附:Javascript方法: String.prototype.escapeHTML = function () { return this.replace(//g, ‘’).replace(//g, ‘’).replace(//g, ‘’).replace(/”/g, ‘"’);} 如果项目已经开发完成了,又不想大批量改动页面的话,可以采用第一种方法,此时需要借助Spring MVC的@InitBinder以及org.apache.commons.lang.PropertyEditorSupport、org.apache.commons.lang.StringEscapeUtils public class StringEscapeEditor extends PropertyEditorSupport { private boolean escapeHTML; private boolean escapeJavaScript; private boolean escapeSQL; public StringEscapeEditor() { super(); } public StringEscapeEditor(boolean escapeHTML, boolean escapeJavaScript, boolean escapeSQL) {super();this.escapeHTML = escapeHTML; this.escapeJavaScript = escapeJavaScript; this.escapeSQL = escapeSQL;}@Overridepublic void setAsText(String text) { if (text == null) { setValue(null);} else {String value = text; if (escapeHTML) { value = StringEscapeUtils.escapeHtml(value); } if (escapeJavaScript) { value = StringEscapeUtils.escapeJavaScript(value); } if (escapeSQL) { value = StringEscapeUtils.escapeSql(value); } setValue(value); }}@Overridepublic String getAsText() { Object value = getValue(); return value != null ? value.toString() : “”; }} 在上面我们做了一个EscapeEditor,下面还要将这个Editor和Spring的Controller绑定,使服务器端接收到数据之后能够自动转移特殊字符。 下面我们在@Controller中注册@InitBinder @InitBinder public void initBinder(WebDataBinder binder) { 这个方法可以直接放到abstract Controller类中,这样子每个Controller实例都能够拥有该方法。至此第二种方法完成,但是在还原的方法暂时还没有。
spring mvc 注解怎么连接所有进入controler的请求并过滤其中的xss
由于只需要对content-type=application/json;charset=UTF-8的json请求进行处理,所以需要重写MappingJacksonHttpMessageConverter部分方法。
注意:如果使用的是MappingJackson2HttpMessageConverter,需要重写MappingJackson2HttpMessageConverter部分方法。
使用springboot怎么添加一个filter过滤器
在实际的web应用程序中,经常需要在请求(request)外面增加包装用于:记录调用日志、排除有XSS威胁的字符、执行权限验证等等。除了上述提到的之外,Spring Boot自动添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,并且我们在自己的项目中还可以增加别的过滤器。
Spring Boot、Spring Web和Spring MVC等其他框架,都提供了很多servlet 过滤器可使用,我们需要在配置文件中定义这些过滤器为bean对象。现在假设我们的应用程序运行在一台负载均衡代理服务器后方,因此需要将代理服务器发来的请求包含的IP地址转换成真正的用户IP。Tomcat 8 提供了对应的过滤器:RemoteIpFilter。通过将RemoteFilter这个过滤器加入过滤器调用链即可使用它。
How Do
一般在写简单的例子时,不需要单独定义配置文件,只需要将对应的bean对象定义在Application类中即可。正式的项目中一般会有单独的web配置文件,我们在项目的com.test.bookpub(与BookpubApplication.java同级)下建立WebConfiguration.java文件,并用@Configuration注解修饰。
package com.test.bookpub;
import org.apache.catalina.filters.RemoteIpFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebApplication {
@Bean
public RemoteIpFilter remoteIpFilter() {
return new RemoteIpFilter();
}
}
通过mvn spring-boot:run启动项目,可以在终端中看到如下的输出信息,证明RemoteIPFilter已经添加成功。
RemoteIPFilter
分析
项目的主类——BookPubApplication,可以看到由@SpringBootApplication注解修饰,这包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。在Spring Boot的自动配置、Command-line Runner一文中曾对这个三个注解做详细解释,@ComponentScan让Spring Boot扫描到WebConfiguration类并把它加入到程序上下文中,因此,我们在WebApplication中定义的Bean就跟在BookPubApplication中定义一样。
方法@Bean public RemoteIpFilter remoteIpFilter() { ... }返回一个RemoteIPFilter类的spring bean。当Spring Boot监测到有javax.servlet.Filter的bean时就会自动加入过滤器调用链。从上图中还可以看到,该Spring Boot项目一次加入了这几个过滤器:characterEncodingFilter(用于处理编码问题)、hiddenHttpMethodFilter(隐藏HTTP函数)、httpPutFormContentFilter、requestContextFilter(请求上下文),以及我们刚才自定义的RemoteIPFilter。