Java 使用Struts 2在登录页面上使用cookie

Java 使用Struts 2在登录页面上使用cookie,java,cookies,struts2,struts,httprequest,Java,Cookies,Struts2,Struts,Httprequest,我正在学习JavaEE,我必须记住使用四小时定时cookie登录的用户 我必须以这种方式实现它,因为cookie部分对我的学校是强制性的。 我知道我的cookie创建得很好(在LoginAction.java),因为我在自定义操作中对其进行了测试。(在我的login.jsp中,我放置了一个struts标记 我创建了一个名为LoginInterceptor的拦截器来拦截每次访问页面的尝试 它截获请求的方式非常正确(是的!),但是我无法检查cookies,因为我的HTTPServletRequest

我正在学习JavaEE,我必须记住使用四小时定时cookie登录的用户

我必须以这种方式实现它,因为cookie部分对我的学校是强制性的。 我知道我的cookie创建得很好(在
LoginAction.java
),因为我在自定义操作中对其进行了测试。(在我的
login.jsp
中,我放置了一个struts标记

我创建了一个名为
LoginInterceptor
的拦截器来拦截每次访问页面的尝试

它截获请求的方式非常正确(是的!),但是我无法检查cookies,因为我的
HTTPServletRequest
null

我如何测试? 我转到索引(
localhost…/myProject/
) 我用“记住我”登录

你有什么想法吗

Index.jsp

<% response.sendRedirect("AccueilAction.action"); %>
public class LoginInterceptor implements Interceptor {

    private HttpServletRequest servletRequest;
    private String cookied = "false";

    public void destroy() {
        System.out.println("destroy");
    }

    public void init() {
        System.out.println("init");
    }

    @Override
    public String intercept(ActionInvocation ai) throws Exception {
        if(ai.getAction() instanceof ServletRequestAware)
        {
            System.out.println("omg");
            this.servletRequest = (HttpServletRequest)ai.getInvocationContext().
                    get(StrutsStatics.HTTP_REQUEST);
        }
        UsersDAO actions = new UsersDAO();
        System.out.println("Entering LoginInterceptor");
        if (getCookie("userID") != null) {
            System.out.println("Looking for cookie userID");
            String cookieValue = getCookie("userID").getValue();
            String login = cookieValue.substring(0, cookieValue.lastIndexOf(","));
            String password = cookieValue.substring(cookieValue.lastIndexOf(",") + 1);
            List list_users = actions.get_users(login, password);
            System.out.println("Checking cookie for user :" + login);
            Iterator i = list_users.iterator();
            Users currentUser;
            while (i.hasNext()) {
                currentUser = (Users) i.next();
                System.out.println(currentUser.getUserFirstName());
                System.out.println(getCookie("userID").getValue());
                if (currentUser.getUserFirstName().equals(login)) {
                    System.out.println("Cookie found !");
                    cookied = "true";
                    return ai.invoke();
                }
            }
        }
        return "login";
    }

    public Cookie getCookie(String name) {
        if (servletRequest != null) {
            if (servletRequest.getCookies() != null) {
                Cookie cookies[] = servletRequest.getCookies();
                Cookie requestedCookie = null;
                if (cookies != null) {
                    for (Cookie current : cookies) {
                        if (current.getName().equals(name)) {
                            requestedCookie = current;
                            break;
                        }
                    }
                }
                return requestedCookie;
            }
        }

        return null;
    }

    public void setServletRequest(HttpServletRequest hsr) {
        this.servletRequest = hsr;
    }

    public String getCookied() {
        return cookied;
    }

    public void setCookied(String cookied) {
        this.cookied = cookied;
    }
}
LoginAction.java
(getter和setter工作,我不显示它们,它们是自动生成的):

//导入。。。。
公共类LoginAction扩展ActionSupport实现ServletRequestAware、ServletResponseAware{
私有布尔值isAdmin=false;
私有字符串消息;
私有字符串登录;
私有字符串密码;
私有字符串用户标识;
私人字符串记住;
private UsersDAO UsersDAO=new UsersDAO();
public ArrayList list_users=new ArrayList();
受保护的HttpServletRequest-servletRequest;
受保护的HttpServletResponse-servletResponse;
@凌驾
公共字符串execute()引发异常{
UsersDAO actions=newusersdao();
列出用户=操作。获取用户(登录名、密码);
迭代器i=list_users.Iterator();
用户;
if(list_users!=null&!list_users.isEmpty()){
而(i.hasNext()){
user=(Users)i.next();
if(user.getUserIsAdm()!=null&&user.getUserIsAdm()){
isAdmin=true;
}
//允许保存当前记录的会话
//ActionContext.getContext().getSession().put(“logged”,user.getUserFirstName());
System.out.println(“成功”);
如果(记住.equals(“true”)){
System.out.println(“注册新cookie”);
Cookie userCookie=新Cookie(“userID”,user.getUserFirstName()+”,“+user.getUserPassword());
userCookie.setMaxAge(60*60*4);
servletResponse.addCookie(userCookie);
}
回归成功;
}
}否则{
System.out.println(“添加操作错误”);
addActionError(“错误:名称为“使用”或“不使用”);
}
返回误差;
}
@凌驾
public void validate(){
System.out.println(“表单验证”);
System.out.println(记住);
映射字段=getFieldErrors();
fields=新的HashMap();
if(login==null | | login.length()==0){
addFieldError(“coucou”、“coucou”);
}
if(password==null | | password.length()==0){
addFieldError(“错误密码”、“错误密码”);
}
}
@凌驾
公共无效设置ServletRequest(HttpServletRequest hsr){
this.servletRequest=hsr;
}
@凌驾
公共无效设置ServletResponse(HttpServletResponse hsr){
this.servletResponse=hsr;
}
}
LoginInterceptor.java

<% response.sendRedirect("AccueilAction.action"); %>
public class LoginInterceptor implements Interceptor {

    private HttpServletRequest servletRequest;
    private String cookied = "false";

    public void destroy() {
        System.out.println("destroy");
    }

    public void init() {
        System.out.println("init");
    }

    @Override
    public String intercept(ActionInvocation ai) throws Exception {
        if(ai.getAction() instanceof ServletRequestAware)
        {
            System.out.println("omg");
            this.servletRequest = (HttpServletRequest)ai.getInvocationContext().
                    get(StrutsStatics.HTTP_REQUEST);
        }
        UsersDAO actions = new UsersDAO();
        System.out.println("Entering LoginInterceptor");
        if (getCookie("userID") != null) {
            System.out.println("Looking for cookie userID");
            String cookieValue = getCookie("userID").getValue();
            String login = cookieValue.substring(0, cookieValue.lastIndexOf(","));
            String password = cookieValue.substring(cookieValue.lastIndexOf(",") + 1);
            List list_users = actions.get_users(login, password);
            System.out.println("Checking cookie for user :" + login);
            Iterator i = list_users.iterator();
            Users currentUser;
            while (i.hasNext()) {
                currentUser = (Users) i.next();
                System.out.println(currentUser.getUserFirstName());
                System.out.println(getCookie("userID").getValue());
                if (currentUser.getUserFirstName().equals(login)) {
                    System.out.println("Cookie found !");
                    cookied = "true";
                    return ai.invoke();
                }
            }
        }
        return "login";
    }

    public Cookie getCookie(String name) {
        if (servletRequest != null) {
            if (servletRequest.getCookies() != null) {
                Cookie cookies[] = servletRequest.getCookies();
                Cookie requestedCookie = null;
                if (cookies != null) {
                    for (Cookie current : cookies) {
                        if (current.getName().equals(name)) {
                            requestedCookie = current;
                            break;
                        }
                    }
                }
                return requestedCookie;
            }
        }

        return null;
    }

    public void setServletRequest(HttpServletRequest hsr) {
        this.servletRequest = hsr;
    }

    public String getCookied() {
        return cookied;
    }

    public void setCookied(String cookied) {
        this.cookied = cookied;
    }
}

在拦截器中,你可以得到像

Cookie[] cookies = ServletActionContext.getRequest().getCookies();

接口与操作一起使用。要访问servlet环境,请使用。

OK!它现在运行良好:D!我认为很难理解这一点。我看不到Intereceptor捕捉操作请求…但操作返回JSP。因此,如果我直接在web浏览器中键入指向另一个页面的链接,它也会被拦截吗?一个大错误无论如何,谢谢:)拦截器与操作一起使用,如果你需要调用某个页面,请使用筛选器。因此,如果我理解,如果有人键入指向我某个页面的url,要在登录页面上强制重定向,我也必须实现筛选器?@ogdabou“指向你某个页面的url”是什么意思?S2拦截器将为包中的任何操作或在拦截器堆栈中配置拦截器的操作调用。例如:某人登录,他将转到WhatEverPage。他把最喜欢的放在上面。他注销了。。对我来说,饼干在4小时后就结束了。5个小时后,他点击他的最爱,然后直接在WhatEverPage上重定向。那里发生了什么?(例如,页面中可以包含一个)