@RequestMapping

时间:2018-04-17 22:53:35

标签: java spring session spring-security

我使用Spring Security进行身份验证。我保存在@SessionAttribut这个auth因为我想访问用户对象。

建议方法

@ControllerAdvice(basePackages= {"com.sencerseven.blog.admin","com.sencerseven.blog.controller"})
@SessionAttributes("User")
public class SessionScope {

    @Autowired
    private UserService userService;

    @ModelAttribute("User")
    public User session() {
        Authentication authentication = 
        SecurityContextHolder.getContext().getAuthentication();

            if(authentication != null) {
                User user = userService.getByEmail(authentication.getName());
                if(user != null) {
                    return user;    
                }

            }
            return null;
    }
}

控制器

@Controller
@RequestMapping("/post")
public class PostController {


@RequestMapping(value= {"/{post}"})
public ModelAndView postPage(@SessionAttribute("User")User tempUser,@PathVariable("post")String tempPostName ) throws NotFoundException  {
 ...
 .....
}


@PostMapping("addcomment")
@ResponseBody
public String saveComment(@SessionAttribute("User")User tempUser,@RequestParam("post_id")int id,@RequestParam("comment")String tempComment) {
 ....
 .....
}


}

@SessionAttribute(“User”)在PostPage方法中返回null。页面抛出异常

 java.lang.NullPointerException at com.sencerseven.blog.controller.PostController.postPage(PostController.jav   a:54) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at 

。但SaveComment方法正常工作。@ SessionAttribute(“User”)在SaveComment访问用户对象时它不是null返回。

为什么?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

Spring Security已经支持这种开箱即用(如文档here所述)。你试图在你自己的实现中试图制造复杂的东西。而不是使用@SessionAttribute使用@AuthenticationPrincipal注释让Spring Security查找并注入用户。

因此,基本上删除您的SessionScope控制器建议,并将@SessionAttribute替换为您控制器上的@AuthenticationPrincipal

@Controller
@RequestMapping("/post")
public class PostController {


    @RequestMapping(value= {"/{post}"})
    public ModelAndView postPage(@AuthenticationPrincipal User tempUser, @PathVariable("post") String tempPostName ) throws NotFoundException  {
        ...
    }

    @PostMapping("addcomment")
    @ResponseBody
    public String saveComment(@AuthenticationPrincipal User tempUser, @RequestParam("post_id") int id, @RequestParam("comment") String tempComment) {
        ...
    }       
}

您必须确保自己的User也是Spring Security使用的User。如果不是这种情况而不是控制器建议,请使用自定义AuthenticationSuccessHandler,将自己的User添加到Session一次(而不是每次请求)。