步骤一:定义。自定义一个类继承RequestProcessor类,然后重写父类的public void process(HttpServletRequest request, HttpServletResponse response)方法,此类和ActionServlet的作用一样的,是处理请求的控制器组件,其是被ActionServlet调用处理请求的。即在进入ActionForm和Action之前处理的请求。如:
package edu.process; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.RequestProcessor; public class RequestCharacterProcessor extends RequestProcessor { @Override public void process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { request.setCharacterEncoding("utf-8"); //response.setContentType("text/html; charset=utf-8"); //用session作用域user属性来标识用户是否登录 Object value = request.getSession().getAttribute("user"); //判断是否登录 if (value!=null) { //下句是一定要执行的,其意思是将请求交给下面的控制器。 super.process(request, response); System.out.println("ddddddddddddddd");//响应回来时,会执行。 }else { //没登陆的话则重定向至登录界面 response.sendRedirect("/login"); } } }
步骤二:注册.自定义的RequestProcessor类需要在strusts-config.xml中注册。如:
在struts-config.xml中的映射: <controller processorClass="edu.encoding.RequestChinese"></controller> 或者: <controller> <set-property property="processorClass" value="edu.encoding.RequestChinese"/> </controller>
(1)process()方法是在填充FormBean和调用Action的execute()之前进行的。
(2)此种方式的权限控制可用于处理请求字符集,响应字符集等,super.process(request,response);之后的代码为响应来时的代码。(经过验证的,这里不写详细代码了)。
(3)struts1.x的这种权限控制只能过滤*.do(假设action的url-pattern为*.do)的请求,并不能过滤*.jsp,*.html的文件。
(4)缺陷:所有*.do的请求都会不例外的请求该处理器。
方式二:定义过滤器filter
步骤一:自定义过滤器类,实现Filter接口并重写器doFilter()方法,在doFilter()进行权限控制,如果交由下一个过滤器或Action或Servlet的话,就调用chain.doFilter(request,response)方法,chain.doFilter()后的代码会在响应回来时调用
package edu.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class PermissionFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("处理请求代码...");
//只有下面的代码执行了,才能将请求交给下一个过滤器或Servlet或Action
chain.doFilter(request, response);
System.out.println("处理响应代码...");
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
步骤二:在web.xml中注册,在url-pattern中可以为不同格式的请求注册不同的过滤器。
<filter> <filter-name>permission</filter-name> <filter-class>edu.filter.PermissionFilter</filter-class> </filter> <filter-mapping> <filter-name>permission</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping>
方式三: struts2中自定义拦截器: 参见:Struts2实现权限控制