首页
JAVA笔记
数据库笔记
混乱记忆
小站记
您现在的位置
struts 拦截器
简介: 在struts项目中使用拦截器对访问权限进行控制

 

代码详情如下:
注解方式实例化Action。
package com.still.action.admin;

import java.io.IOException;
import java.io.PrintWriter;

//import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.convention.annotation.Action;

import com.still.action.BaseAction;

@Action(value="staff")
public class StaffAdmin extends BaseAction{

/**
 * 
*/
 private static final long serialVersionUID = 1L;
 private final String encoding = "GBK";

 public String getStaff(){
 try {
 StaffAdmin.responseOut(encoding, "登录中...", this.getResponse());
 System.out.println(this.getRequest().getParameter("str"));
 } catch (Exception e) {
 e.printStackTrace();
 }
 return null;
 }

 public Object getModel() {
 return null;
 }

public static void responseOut(String encoding, String data, HttpServletResponse response) {
 response.setContentType("text/html; charset=" + encoding);
 try {
 PrintWriter pw = response.getWriter();
 pw.print(data);
 pw.close();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }

}
struts.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
 <!-- 本地化设置(默认浏览器语言) -->
 <constant name="struts.locale" value="zh_CN" /> 
<!-- 国际化资源文件名称 -->
 <constant name="struts.custom.i18n.resources" value="i18n" />
 <!-- 是否自动加载国际化资源文件 -->
 <constant name="struts.i18n.reload" value="true" />
 <!-- 设置字符集,请求参数的编码方式 -->
 <constant name="struts.i18n.encoding" value="gbk" />
 <!-- 设置上传文件最大的字节数 -->
 <constant name="struts.multipart.maxSize" value="1000000000" />
 <!-- 设置浏览器是否使用浏览器缓存,开发环境建议为false -->
 <constant name="struts.serve.static.browserCache" value="false" />
 <!-- 设置使用struts的标签主题,开发环境建议用simple -->
 <constant name="struts.ui.theme" value="simple" />
 <!-- 设置使用struts的开发模式,开发环境建议为true -->
 <constant name="struts.devMode" value="true"/>  

<package name="struts-base" extends="struts-default"><!-- namespace="/still" -->
 <!-- 自定义拦截器 -->
 <!-- 
<interceptors>
 <interceptor-stack name="myStack">
 <interceptor-ref name="sessionOut"></interceptor-ref>
 <interceptor-ref name="oprationLog"></interceptor-ref>
 <interceptor-ref name="defaultStack"></interceptor-ref>
 </interceptor-stack>
 </interceptors>
-->

<interceptors>
 <interceptor name="myInterceptor" class="com.still.test.TEST">
 <!-- <param name="includeMethods">staff</param> -->
 </interceptor>
 <interceptor-stack name="myStack">
 <interceptor-ref name="myInterceptor"></interceptor-ref>
 <interceptor-ref name="defaultStack"></interceptor-ref>
 </interceptor-stack>
 </interceptors>

 <!-- 默认拦截器 -->
 <default-interceptor-ref name="myStack"></default-interceptor-ref>

<global-results>
 <result name="Login">/login.jsp</result> <!-- type="redirect" 重定向,否则转发-->
 <result name="error">/error.jsp</result>
 <result name="Exception">/error.jsp</result>
 </global-results>

 <!-- 捕获到Exception,跳转到Exception.jsp,result="Exception" 对应global-results中name="Exception" (web.xml已配置)
 <global-exception-mappings>
 <exception-mapping result="Exception" exception="java.lang.Exception" /> 
</global-exception-mappings>
-->
 </package>

</struts>
下面的是自定义的拦截器类。
package com.still.test;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class TEST extends AbstractInterceptor {

 /**
 * 
*/
 private static final long serialVersionUID = 1L;

 @Override
 public String intercept(ActionInvocation invocation) throws Exception {
 System.out.println("HelloWorld!");
 String result = invocation.invoke();
 return result;
 }

}
问题是为什么过来的请求都没用经过自己的拦截器?

后来找了问题的关键,其实就是web.xml里面的问题:之前只是配了核心过滤器,但是的我的struts.xml不在classpath下面,需要重新配上相对路径就可以了。