对于Struts2实现拦截get请求,即只允许post请求的方法很多
最容易想到的想法就是在表单中设置一个隐藏域,该隐藏一次有效,类似于验证码。
这样也是可以实现的,只是有一个问题,该隐藏域任然容易被获取到,并且每次都添加也很麻烦,这里我们就可以使用Struts2的拦截器来实现
Strus2的拦截器继承了AbstractInterceptor类,并且需要重写intercept方法。
这里我们写2个拦截器,以方便大家举一反三的了解和学习
第一个拦截器(InterceptorGet),是拦截请求,只允许post请求
public class InterceptorGet extends AbstractInterceptor{ private static final long serialVersionUID = 1L; @Override public String intercept(ActionInvocation arg0) throws Exception { String method = ServletActionContext.getRequest().getMethod(); if(method.equalsIgnoreCase("POST")){ return arg0.invoke(); } return "login404"; } }
return “login404” ; 表示返回login404的全局结果,下面我们列出struts.xml的相关配置
第二个拦截器(interceptorAdmin),是拦截未登录用户访问管理页面,如游客访问管理员页面
public class interceptorAdmin extends AbstractInterceptor{ private static final long serialVersionUID = 1L; @Override public String intercept(ActionInvocation invocation) throws Exception { Map<?, ?> session = invocation.getInvocationContext().getSession(); userinfo uif = (userinfo) session.get("user"); if(uif == null){ //返回到登录页面 return Action.LOGIN; }else{ return invocation.invoke(); } } }下面我们开始配置struts.xml
首先在里面定义拦截器,这里的配置因为没有配置拦截器栈,所以没有顺序,配置拦截器栈就有顺序的。(拦截器是按顺序一个一个的执行的哦)
<interceptors> <!-- 自定义拦截器 --> <!-- 只允许post请求 --> <interceptor name="myinterceptorget" class="emb.view.struts.interceptor.InterceptorGet" /> <!-- 管理页面比如有session --> <interceptor name="myinterceptoradmin" class="emb.view.struts.interceptor.interceptorAdmin" /> </interceptors>然后配置全局结果,全局结果中的name就是我们上面两个拦截器的返回结果。
<!-- 定义全局结果 --> <global-results> <result name="login404" type="redirect">login.jsp?error=404</result> <result name="login" type="redirect">login.jsp</result> </global-results>
最后在我们需要拦截的action里面进行配置即可
<action name="ACupuserhb" class="upuserhb"> <interceptor-ref name="myinterceptorget" /> <interceptor-ref name="myinterceptoradmin" /> <result type="redirect">admin/index.jsp</result> </action>需要注意的是,根据实际需求,在配置需要拦截的action的时候,这里的拦截器是有顺序的,所以请根据你的实际需求类配需吧,你也可以把这两个拦截器放进拦截器栈中,,在action里面就可以只写拦截器栈的名字了
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情