在Struts2中的拦截器是如何工作的
时间: 2024-05-24 13:15:28 浏览: 13
在Struts2中,拦截器是一种可重用的组件,用于拦截请求并对其进行处理。它们可以在Action之前或之后执行,也可以在结果被渲染之前或之后执行。Struts2中的拦截器是基于责任链模式实现的,每个拦截器都可以决定是否将请求转移到下一个拦截器或Action。拦截器可以用于很多用途,如验证用户身份、记录日志、性能分析等。
在Struts2中,每个请求都会通过一个由一系列拦截器组成的拦截器栈。这个拦截器栈可以在struts.xml文件中配置。当请求到达时,它会按照配置的拦截器栈顺序依次执行每个拦截器。如果其中任何一个拦截器决定不继续处理请求,它可以将控制权转移到下一个拦截器或Action。
在执行Action之前,执行的是预处理拦截器,例如参数拦截器、类型转换拦截器等。在执行Action之后,执行的是后处理拦截器,例如异常处理拦截器、结果处理拦截器等。最后,结果被渲染并返回给客户端。
相关问题
struts2权限拦截器
在 Struts2 中,可以使用拦截器来实现权限控制。具体来说,可以编写一个自定义的拦截器,然后在 struts.xml 配置文件中将其配置为需要进行权限控制的 Action 的拦截器。以下是一个简单的权限拦截器示例:
```java
public class AuthInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// 获取当前用户
User user = (User) ActionContext.getContext().getSession().get("user");
// 判断用户是否拥有权限
if (user != null && user.hasPermission(invocation.getInvocationContext().getName())) {
// 如果有权限,则继续执行 Action
return invocation.invoke();
} else {
// 如果没有权限,则跳转到错误页面
return "error";
}
}
}
```
在上述代码中,我们首先获取了当前用户,然后判断用户是否拥有执行当前 Action 的权限。如果有权限,则继续执行 Action;否则,跳转到错误页面。
接下来,在 struts.xml 配置文件中,我们可以将该拦截器配置为需要进行权限控制的 Action 的拦截器,如下所示:
```xml
<action name="myAction" class="com.example.MyAction">
<interceptor-ref name="authInterceptor"/>
<result name="success">/myAction.jsp</result>
<result name="error">/error.jsp</result>
</action>
<interceptor-stack name="authStack">
<interceptor-ref name="authInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
<interceptors>
<interceptor name="authInterceptor" class="com.example.AuthInterceptor"/>
</interceptors>
```
在上述代码中,我们首先定义了一个名为 authStack 的拦截器栈,该拦截器栈包含了 authInterceptor 和 defaultStack 两个拦截器。然后,我们将 myAction Action 配置为使用 authStack 拦截器栈。最后,我们定义了一个名为 authInterceptor 的拦截器,并将其添加到了 interceptors 中。
这样一来,当用户访问 myAction Action 时,就会先执行 authInterceptor 拦截器,进行权限控制,然后再执行 defaultStack 拦截器栈中的其它拦截器。如果 authInterceptor 拦截器返回了 error,则会跳转到 error.jsp 页面;否则,会跳转到 myAction.jsp 页面。
struts2配置xss拦截器
在 Struts2 中,可以使用拦截器来防止 XSS 攻击。以下是一些步骤:
1. 创建一个类,继承 org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter。
```java
public class XSSFilter extends StrutsPrepareAndExecuteFilter {
@Override
protected void postInit(FilterConfig filterConfig) throws ServletException {
super.postInit(filterConfig);
// 添加 XSS 拦截器
addFilter(new FilterHolder(new XSSInterceptor()), "/*", null);
}
}
```
这个类的作用是在 Struts2 启动时添加一个 XSS 拦截器。
2. 创建一个 XSS 拦截器。
```java
public class XSSInterceptor implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 对请求参数进行 XSS 过滤
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
filterChain.doFilter(new XSSRequestWrapper(request), response);
}
@Override
public void destroy() {
}
}
```
这个拦截器的作用是对请求参数进行 XSS 过滤。
3. 创建一个 XSSRequestWrapper 类,继承 HttpServletRequestWrapper。
```java
public class XSSRequestWrapper extends HttpServletRequestWrapper {
public XSSRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
String value = super.getParameter(name);
if (value != null) {
value = Jsoup.clean(value, Whitelist.basic());
}
return value;
}
}
```
这个类的作用是重写 getParameter 方法,在获取请求参数时进行 XSS 过滤。
4. 在 web.xml 中添加过滤器配置。
```xml
<filter>
<filter-name>xssFilter</filter-name>
<filter-class>com.example.XSSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>xssFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
```
这个配置的作用是将 XSSFilter 拦截器应用于所有的请求。
以上是一个简单的 Struts2 XSS 拦截器的配置。但是需要注意的是,这个拦截器只能对请求参数进行 XSS 过滤,对于响应内容的过滤需要使用其他的方案来解决。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)