针对网站的访问安全问题,很多网站采取了过滤器和拦截器的方法来进行控制,而在struts2框架中也存在两种安全控制机制:过滤器(Filter)和拦截器(Interceptor)。下面,我将从以下几个方面对这两种机制进行分析,希望对你有所帮助。
过滤器(Filter)和拦截器(Interceptor)的概念
过滤器(Filter)是一种Servlet技术,可以拦截请求和响应、修改请求和响应、重定向请求和响应等,并将修改后的请求和响应转发给下一个Servlet或JSP。即:它是在Web应用程序中为了在处理请求之前或之后执行某些任务而存在的组件。
而拦截器(Interceptor)则是一种AOP思想的产物,它位于Action和Web服务器之间,可以对Action的调用进行拦截,以完成一些与请求相关的预处理或后处理任务。拦截器可以对Action进行统一控制,如:实现日志记录、权限控制、事务控制等。
过滤器(Filter)和拦截器(Interceptor)的区别
-
触发时机不同:过滤器在请求之前或之后执行,直接处理HTTP请求和响应;而拦截器则在Action处理请求时执行,只处理Action相关的请求,不可以直接处理HTTP请求和响应。
-
执行顺序不同:过滤器的执行顺序是由其在web.xml文件中的顺序决定的,而拦截器则可以通过定义在struts.xml文件中的拦截器栈(Interceptor Stack)来指定执行顺序,即可以通过改变拦截器栈中的顺序来改变拦截器的执行顺序。
-
作用范围不同:过滤器可以对所有的Web资源进行拦截,如JSP、HTML、图片等;而拦截器只能对Action进行拦截。
过滤器(Filter)和拦截器(Interceptor)的使用场景
-
过滤器(Filter)的应用场景主要用于过滤输入内容,或者对请求进行安全控制等操作。比如:限制某些IP访问Web资源、屏蔽冗余的HTML代码、防止XSS攻击、防止SQL注入等。
-
拦截器(Interceptor)的应用场景主要是在开发时进行系统设计、重构或者业务增强。比如:进行日志记录、进行性能监控、对特定用户进行权限控制等。
示例一:使用过滤器实现防止SQL注入攻击
在web.xml文件中定义过滤器:
<filter>
<filter-name>sqlFilter</filter-name>
<filter-class>com.example.servlet.SQLFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sqlFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
编写SQLFilter.java文件:
public class SQLFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
// 参数预处理:替换掉特殊字符
String keyword = req.getParameter("keyword");
keyword = keyword.replaceAll("(?i)delete", "").replaceAll("(?i)update", "");
req.getParameterMap().put("keyword", new String[] { keyword });
chain.doFilter(req, resp);
}
@Override
public void destroy() {
}
}
示例二:使用拦截器统一处理日志记录
在struts.xml文件中定义拦截器栈:
<struts>
<constant name="struts.custom.i18n.resources" value="i18n" />
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="logInterceptor" class="com.example.interceptor.LogInterceptor" />
<interceptor-stack name="defaultStack">
<interceptor-ref name="logInterceptor" />
<interceptor-ref name="defaultInterceptor" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack" />
<result-types>
<result-type name="dispatcher" default="true"
class="org.apache.struts2.dispatcher.ServletDispatcherResult" />
</result-types>
<action name="index" class="com.example.action.IndexAction">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
编写LogInterceptor.java文件:
public class LogInterceptor implements Interceptor {
private static final long serialVersionUID = 1L;
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// 执行前处理
String actionName = invocation.getInvocationContext().getName();
long startTime = System.currentTimeMillis();
// 执行Action
String result = invocation.invoke();
// 执行结果处理
long endTime = System.currentTimeMillis();
System.out.println("Action:" + actionName + ",执行时间:" + (endTime - startTime) + "ms");
return result;
}
}
以上就是关于struts2过滤器和拦截器的区别分析及两个示例的攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:struts2过滤器和拦截器的区别分析 - Python技术站