您的位置:首页 > 其它

菜鸟小项目_拦截器的应用

2016-06-22 21:41 232 查看
需求:

  我们在处理用户登录时,不希望用户在没登录的情况下访问某些资源,此处我们可以使用拦截器来达到我们的目的

实现步骤:

1、编写login.jsp

<body>
<h2>用户登录</h2>
${loginError}
<form action="login.action" method="post">//将用户的信息提交给login.action进行校验
用户名:<input type="text" name="username">
密码:   <input type="password" name="password">
<input type="submit" value="登录">
</form>
</body>
2、配置Struts.xml

前面表单中的提交到login.action其实就是struts.xml中配置的action的名字

<action name="login" class="com.imooc.actiom.loginAction" method="login">
<result>/WEB-INF/page/manager.jsp</result>
<result name="login">/login.jsp</result>
<!--<interceptor-ref name="myInterceptorStack"></interceptor-ref>-->//此处如果也加上后面定义的拦截器栈,则会无法登陆,因为执行login.action之前都会<pre name="code" class="plain"> //经过拦截器,此时session里面还没有值,所以会一直返回到login.jsp上,故,此处不能加

</action>


</pre><pre>
3、编写com.actiom.loginAction.java

public class loginAction extends ActionSupport implements SessionAware{

private String username;
private String password;
private Map<String, Object> sessiona;//由于我们用到了session所以实现了SessionAware接口并重写了setSession方法
</span>

@Override
public void setSession(Map<String, Object> session) {
// TODO Auto-generated method stub
this.sessiona=session;

}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

//处理登录请求
public String login(){//这就是我们前面struts中配置的login方法
System.out.println("bbbbbbbbbbbbbb");

if("admin".equals(username)&&"123".equals(password)){
sessiona.put("logInfo", username);//将用户信息保存到session中
return SUCCESS;
}else{

sessiona.put("loginError", "用户名或密码不正确");
return ERROR;

}

}
}


3、由于我们访问的页面在/WEB-INF下,直接访问不到所以我们需要一个action去访问,接着配置struts.xml

<action name="auth">
<result>/WEB-INF/page/manager.jsp</result>//返回SUCCESS字符串是调用manager.jsp
<result name="<span style="color:#ff0000;">login</span>">/login.jsp</result>//返回login字符串时调用login.jsp
<!-- 引用自定义的拦截器栈 -->
<interceptor-ref name="myInterceptorStack"></interceptor-ref>//在没有此处的拦截器栈的话,用户可以直接通过localhost:8080/项目名/auth.ation                                                                             //去访问manager.jsp,此处接第6步
</action>


4、编写拦截器
public class AuthInterceptor extends <span style="background-color: rgb(204, 204, 204);"><span style="color:#ff0000;">AbstractInterceptor </span></span>{

@Override
public String <span style="color:#ff0000;">intercept</span>(ActionInvocation invacation) throws Exception {

ActionContext context=ActionContext.getContext();//获取ActionContext以获得session
System.out.println("aaaaaaaa");
Map<String, Object> session=context.getSession();
if(session.get("logInfo")!=null){//如果session中不为空说明用户已经登录(此处是用户直接通过localhost:8080/项目名/auth.ation来访问资源时才会通过拦截器,正常登录的情况下不经过拦截器)<pre name="code" class="plain">

String result=invacation.invoke();//得到一个字符串的结果SUCCESS
</pre><span style="font-family: Arial, Helvetica, sans-serif;">                                return result;</span>


}else{return "login";//如果session为空说明用户没有登录,返回字符串login,见第3步}}}


5、编写好了拦截器还不算完,编写完得用,用的话必须要到struts.xml中去注册拦截器

<interceptors>
<interceptor name="auth" class="com.imooc.interceptor.AuthInterceptor"></interceptor>//注册拦截器
<!-- 自定义的拦截器栈 -->
<interceptor-stack name="myInterceptorStack">//将自己注册拦截器和默认的拦截器组合成拦截器栈
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="auth"></interceptor-ref>
</interceptor-stack>

</interceptors>
6、注册了拦截器之后,我们还要去struts.xml中具体的action中去引用拦截器(见第3步)

完成了上面的步骤之后,基本上实现了一个简单地拦截器的应用,但是自己还是有些不太明白这个拦截器和servlet的具体应用上的不同,以后补充
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: