Spring - 在 JSTL 中调用服务方法
Spring - Call a Service method in JSTL
我正在使用 Spring 安全来处理我的 Spring MVC 网络应用程序的用户身份验证。我可以从身份验证 object 中获取用户名,但我的用户名是电子邮件地址,我希望能够在我的 header 中显示用户的真实姓名。
所以我有我的自定义用户 class:
class Users{
String name;
String email;
String password;
// getters and setters
}
我考虑过使用 aop 作用域代理来设置 session 中的用户,如本博客所述:http://richardchesterwood.blogspot.co.uk/2011/03/using-sessions-in-spring-mvc-including.html。我在使用这种方法时遇到的问题是 AuthenticationSuccessHandler 实际上是一个服务,应该是无状态的。所以 Spring 不会在服务中为我自动装配用户 object。
所以我创建了一个服务方法,可以从身份验证 object 和 return 我的用户 object 中获取用户名(或电子邮件)。我可以在我的控制器中使用它。
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Override
public Users getCurrentUser() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
User userD = (User)auth.getPrincipal();
Users currentUser = getUserByEmail(userD.getUsername());
return currentUser;
}
}
那么有没有一种方法可以让我从 JSTL 调用这个服务方法来获取用户的全名,我可以将其显示在我的 header 中?
我也乐于接受有关更好的实施方法的建议。
编辑:
在我之前使用 AuthenticationSuccessHandler 的方法中,我的代码是这样的:
@Service("userDetailsService")
@Transactional
public class UserAuthenticationServiceImpl implements AuthenticationSuccessHandler {
@Autowired
Users currentUser;
@Override
public void onAuthenticationSuccess(HttpServletRequest hsr, HttpServletResponse hsr1, Authentication a) throws IOException, ServletException {
User user = (User) a.getPrincipal();
Users user1 = userDao.getUserByEmail(user.getUsername());
currentUser.setName(user1.getName());
currentUser.setUserRoles(user1.getUserRoles());
//currentUser = user1;
}
}
在我的 spring-servlet.xml 文件中,我有这个:
<bean id="currentUser" class="com.foo.bean.Users" scope="session">
<!-- this next element effects the proxying of the surrounding bean -->
<aop:scoped-proxy/>
</bean>
我在这里面临的问题是 Spring 没有自动装配我的 currentUser object 因为该服务不在 session 范围内。
如果您唯一需要的是全名,只需使用 AuthenticationSuccessHandler
检索用户并将名称添加到会话中(如果您需要更多,则添加完整用户)。
@Override
public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse res, Authentication auth) throws IOException, ServletException {
User user = (User) auth.getPrincipal();
Users user1 = userDao.getUserByEmail(user.getUsername());
WebUtils.setSessionAttribute(req, "currentUser" user1);
}
那么在您的 JSP 中,您唯一需要的就是 ${currentUser.username}
。
虽然我不建议在会话中填充完整的用户,但我建议只添加所需的信息。
WebUtils.setSessionAttribute(req, "currentUsername" user1.getUsername());
然后在你的JSP${currentUsername}
中为你节省了很多会话的序列化开销。
我正在使用 Spring 安全来处理我的 Spring MVC 网络应用程序的用户身份验证。我可以从身份验证 object 中获取用户名,但我的用户名是电子邮件地址,我希望能够在我的 header 中显示用户的真实姓名。
所以我有我的自定义用户 class:
class Users{
String name;
String email;
String password;
// getters and setters
}
我考虑过使用 aop 作用域代理来设置 session 中的用户,如本博客所述:http://richardchesterwood.blogspot.co.uk/2011/03/using-sessions-in-spring-mvc-including.html。我在使用这种方法时遇到的问题是 AuthenticationSuccessHandler 实际上是一个服务,应该是无状态的。所以 Spring 不会在服务中为我自动装配用户 object。
所以我创建了一个服务方法,可以从身份验证 object 和 return 我的用户 object 中获取用户名(或电子邮件)。我可以在我的控制器中使用它。
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Override
public Users getCurrentUser() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
User userD = (User)auth.getPrincipal();
Users currentUser = getUserByEmail(userD.getUsername());
return currentUser;
}
}
那么有没有一种方法可以让我从 JSTL 调用这个服务方法来获取用户的全名,我可以将其显示在我的 header 中?
我也乐于接受有关更好的实施方法的建议。
编辑:
在我之前使用 AuthenticationSuccessHandler 的方法中,我的代码是这样的:
@Service("userDetailsService")
@Transactional
public class UserAuthenticationServiceImpl implements AuthenticationSuccessHandler {
@Autowired
Users currentUser;
@Override
public void onAuthenticationSuccess(HttpServletRequest hsr, HttpServletResponse hsr1, Authentication a) throws IOException, ServletException {
User user = (User) a.getPrincipal();
Users user1 = userDao.getUserByEmail(user.getUsername());
currentUser.setName(user1.getName());
currentUser.setUserRoles(user1.getUserRoles());
//currentUser = user1;
}
}
在我的 spring-servlet.xml 文件中,我有这个:
<bean id="currentUser" class="com.foo.bean.Users" scope="session">
<!-- this next element effects the proxying of the surrounding bean -->
<aop:scoped-proxy/>
</bean>
我在这里面临的问题是 Spring 没有自动装配我的 currentUser object 因为该服务不在 session 范围内。
如果您唯一需要的是全名,只需使用 AuthenticationSuccessHandler
检索用户并将名称添加到会话中(如果您需要更多,则添加完整用户)。
@Override
public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse res, Authentication auth) throws IOException, ServletException {
User user = (User) auth.getPrincipal();
Users user1 = userDao.getUserByEmail(user.getUsername());
WebUtils.setSessionAttribute(req, "currentUser" user1);
}
那么在您的 JSP 中,您唯一需要的就是 ${currentUser.username}
。
虽然我不建议在会话中填充完整的用户,但我建议只添加所需的信息。
WebUtils.setSessionAttribute(req, "currentUsername" user1.getUsername());
然后在你的JSP${currentUsername}
中为你节省了很多会话的序列化开销。