struts2会话维护

我正在使用struts 2 MVC框架开发一个Web应用程序。 我目前正在研究它的登录模块。 我是这些技术的新手。 我在维持会话方面遇到了问题。 我希望如果有人直接点击个人资料页面的url(成功登录时打开的页面),那么他或她将被重定向回登录页面。 此外,如果有人使用错误的凭据登录,则会再次将其重定向回登录页面。 此外,如果他输入一些登录详细信息,则必须首先检查凭证,如果凭证r正确,则必须设置会话变量。 在呈现配置文件页面之前,会检查会话变量是否已设置。 如果仅设置了会话变量,则控件将传递到配置文件页面。

以下是我的登录表单代码loginPage.jsp:此页面显示用户的登录页面:

      LOGIN PAGE           

现在是我的loginAction类:这是我的操作类,对应于在登录表单上单击登录按钮时生成的登录操作。

 package com.view; import java.util.Map; import org.apache.struts2.interceptor.SessionAware; import com.controller.LoginManager; import com.model.Login; import com.model.UserDetails; public class LoginAction implements SessionAware{ private Login login; private LoginManager loginManager; private UserDetails userDetails; Map map; public LoginAction() { loginManager=new LoginManager(); } public String loginLink() { return "loginClicked"; } public String checkLogin() { try { //String loggedInUsername=null; System.out.println("---------"+login.getUsername()); /*if(map.containsKey("username")) { loggedInUsername=(String)map.get("username"); }*/ userDetails=loginManager.check(login); /*if(loggedInUsername!=null && loggedInUsername==userDetails.getUsername()) { return "loginSuccess"; }*/ if(userDetails!=null && userDetails.getUsername()!=null) { map.put("login",true); map.put("username",userDetails.getUsername()); map.put("name",userDetails.getName()); map.put("sex",userDetails.getSex()); map.put("email",userDetails.getEmail()); map.put("phoneno",userDetails.getPhone_no()); System.out.println("Inside session map creation that is Successful login"); return "loginSuccess"; } else { System.out.println("Inside check login with invalid credentials"); return "loginClicked"; } }catch(Exception ex) { System.out.println("Inside exception of checkLogin."); return "loginClicked"; } } public void setLogin(Login login) { this.login=login; } public Login getLogin() { return login; } @Override public void setSession(Map map) { this.map=map; } } 

loginManager类:此类处理数据库部分。 在此课程中检查登录凭据。

 package com.controller; import org.hibernate.Query; import org.hibernate.classic.Session; //import java.util.List; import com.model.Login; import com.model.UserDetails; import com.util.HibernateUtil; public class LoginManager extends HibernateUtil{ UserDetails userDetails; public UserDetails check(Login login) { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); try { System.out.println("Inside try block to retrieve from db"); String hql="FROM UserDetails where username='"+login.getUsername()+"' and password='"+login.getPassword()+"' and role='U'"; Query query = session.createQuery(hql); System.out.println("Query Created"); userDetails=(UserDetails)query.uniqueResult(); //System.out.println("Returned Username"+userDetails.getUsername()); //System.out.println("Returned Password"+userDetails.getPassword()); session.getTransaction().commit(); }catch(Exception ex){ System.out.println("Exception generated is "+ex.getMessage()); session.getTransaction().rollback(); userDetails=null; ex.printStackTrace(); } return userDetails; } } 

下面是我的struts.xml文件:

              /registerPage1.jsp   /registrationSuccess.jsp    /profile.jsp /loginFail.jsp /loginPage.jsp      /loginPage.jsp    

任何人都可以帮助我使用应该编写的拦截器代码,以实现上面指定的function。

我读了评论,正如Dave Newton所提到的,这是拦截器代码:

 public class LoginInterceptor extends AbstractInterceptor { @Override public String intercept(final ActionInvocation invocation) throws Exception { Map session = ActionContext.getContext().getSession(); String username = (String) session.get("username");//getting username from session // If the user is already logged-in, then let the request through. if (username != null) { return invocation.invoke(); } Object action = invocation.getAction(); // get which action class is called // for the first action LoginAction interceptor will allow request to be forwarded. if (action instanceof LoginAction) { return invocation.invoke(); } else { return "notAuthorized"; } } } 

现在,在下面的struts.xml中添加代码

  /loginPage.jsp  

这个答案基于您的代码。 我提到了这篇最好的post
这里有一些可能对您有帮助的链接

  1. 会话拦截器
  2. 包配置
  3. 拦截器
  4. 拦截器堆栈示例
    谢谢。