struts学习-使用拦截器控制登陆权限拦截

    技术2022-07-16  82

    jsp:

    简单的一个登陆页面。

    <%-- Created by IntelliJ IDEA. User: bin Date: 2020-07-02 Time: 13:23 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> <form action="login.action" method="post"> 账号:<input name="user.name" type="text"><br> 密码:<input name="user.password" type="text"><br> <input type="submit" value="注册"> </form> </body> </html>

    登陆成功后才能访问的页面。就是测试能不能访问的。

    <html> <body> <h2>shout!</h2> </body> </html>

    登陆成功的页面,一样时测试的。

    <%@page isELIgnored="false" pageEncoding="UTF-8" %> <html> <body> <h2>bins !</h2> 欢迎回来${user.name} </body> </html>

    action:

    登陆的逻辑方法,简单的判断

    package com.bin.action; import com.bin.entity.User; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.ServletActionContext; import java.util.Map; public class LoginAction extends ActionSupport { public User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String login(){ System.out.println("进来了"); if ("bin".equals(user.getName())&&"bin".equals(user.getPassword())){ System.out.println("登陆成功"); Map<String, Object> sessionMap = ActionContext.getContext().getSession(); sessionMap.put("user",user); return SUCCESS; }else { return ERROR; } } public String registr(){ return SUCCESS; } public String sss(){ return SUCCESS; } }

    Interceptor:

    自定义的拦截器

    package com.bin.interceptor; import com.bin.entity.User; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionProxy; import com.opensymphony.xwork2.interceptor.Interceptor; import java.util.Map; public class myInterceptor implements Interceptor { @Override public void destroy() { } @Override public void init() { } @Override public String intercept(ActionInvocation invocation) throws Exception { //得到当前拦截的的目标Action代理对象(那个action请求来访问就获取这个action的代理对象。就好像给这个对象起个别名) ActionProxy proxy = invocation.getProxy(); 得到当前执行的action的方法,action请求中的执行方法。 String proxyMethod = proxy.getMethod(); //简单的判断,这个是不拦截的方法,类似于登陆,注册之类的 if ("login".equals(proxyMethod)||"registr".equals(proxyMethod)){ //这就话就是放行 invocation.invoke(); } //获取session域中的数据 Map<String, Object> sessionMap = ActionContext.getContext().getSession(); User user = (User) sessionMap.get("user"); if (user==null){ //判断是否存在,不存在就跳转回登陆页面 return "login"; }else { //方形 return invocation.invoke(); } } }

    user:

    别忘了创建实体类了

    package com.bin.entity; public class User { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "user{" + "name='" + name + '\'' + ", password='" + password + '\'' + '}'; } }

    struts.xml:

    最重点的来的,xml的配置文件。

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!--自己定义的默认包,继承struts2中默认额拦截器包中的18个拦截器,同时还使用了自己定义的拦截器 --> <package name="myDefault" extends="struts-default" abstract="true"> <!--定义拦截器 --> <interceptors> <!--自己定义的拦截器,在这里配置到xml文件中--> <interceptor name="myInterceptor" class="com.bin.interceptor.myInterceptor"></interceptor> <!--拦截器栈,定义自己的拦截器栈,里面注入的是struts2默认的拦截器和我们自己写的拦截器--> <interceptor-stack name="myStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="myInterceptor"></interceptor-ref> </interceptor-stack> </interceptors> <!--这是在全局使用的我们的拦截器栈--> <default-interceptor-ref name="myStack"></default-interceptor-ref> </package> <package name="default" extends="myDefault" namespace="/"> <!--定义的全局变量,只要是返回值为login的,都走这个result--> <global-results> <result name="login">/logini.jsp</result> </global-results> <!--登陆action的配置--> <action name="login" class="com.bin.action.LoginAction" method="login"> <result name="success">/WEB-INF/jsp/bins.jsp</result> <result name="error">/index.jsp</result> </action> <!--这个是登陆之后才能访问的--> <action name="bin" class="com.bin.action.LoginAction" method="sss"> <result name="success">/WEB-INF/jsp/shout.jsp</result> </action> <!-- 需要权限才能访问的页面--> <action name="*"> <result>/WEB-INF/jsp/*.jsp</result> </action> </package> </struts>

    Processed: 0.016, SQL: 9