代码之家  ›  专栏  ›  技术社区  ›  theanilpaudel

Jackson不匹配InputException:由于输入结束,没有要映射的内容

  •  1
  • theanilpaudel  · 技术社区  · 8 年前

    @Entity
    public class ApplicationUser {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        Long id;
        String username,password;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }
    

        public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
            private AuthenticationManager authenticationManager;
    
            public JWTAuthenticationFilter(AuthenticationManager authenticationManager) {
                this.authenticationManager = authenticationManager;
            }
    
            @Override
            public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
                try {
                    System.out.println("request "+request.getPathInfo());
                    ApplicationUser user = new ObjectMapper().readValue(request.getInputStream(),ApplicationUser.class);
    //this is where the exception is    
                    return authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(user.getUsername(),user.getPassword(),new ArrayList<>()));
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
    
            @Override
            protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
                String token = Jwts.builder()
                        .setSubject(((ApplicationUser) authResult.getPrincipal()).getUsername())
                        .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                        .signWith(SignatureAlgorithm.HS512, SECRET.getBytes())
                        .compact();
                response.addHeader(HEADER_STRING, TOKEN_PREFIX + token);
            }
        }
    

    这是我的安全配置:

    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        private BCryptPasswordEncoder bCryptPasswordEncoder;
        private UserDetailsService userDetailsService;
    
        public SecurityConfig(AppUserDetailService userDetailsService, BCryptPasswordEncoder bCryptPasswordEncoder){
            this.bCryptPasswordEncoder=bCryptPasswordEncoder;
            this.userDetailsService=userDetailsService;
        }
    
    
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.cors().and().csrf().disable().authorizeRequests()
                    .antMatchers(HttpMethod.POST, SIGN_UP_URL).permitAll()
    //                .antMatchers(HttpMethod.POST,LOGIN_URL).permitAll()
                    .anyRequest().authenticated()
                    .and()
                    .addFilter(new JWTAuthenticationFilter(authenticationManager()))
                    .addFilter(new JWTAuthorizationFilter(authenticationManager()))
                    // this disables session creation on Spring Security
                    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        }
        @Override
        public void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder);
        }
        @Bean
        CorsConfigurationSource corsConfigurationSource() {
            final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            source.registerCorsConfiguration("/**", new CorsConfiguration().applyPermitDefaultValues());
            return source;
        }
    }
    

    注册工作正常,但当我尝试使用相同的凭据登录时,会出现以下异常:

    位于[来源:(org.apache.catalina.connector.CoyoteInputStream);行:1,列:0] 在com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)~[jackson-databind-2.9.6.jar:2.9.6] 在com.fasterxml.jackson.databind.ObjectMapper.\u initForReading(ObjectMapper.java:4145)~[jackson-databind-2.9.6.jar:2.9.6] 在com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3070)~[jackson-databind-2.9.6.jar:2.9.6] 在com.project.pq.security.JWTAuthenticationFilter.attemptAuthentication(JWTAuthenticationFilter.java:35)~[classes/:na]

    this

    谢谢

    1 回复  |  直到 8 年前
        1
  •  2
  •   Mervyn Zhang    8 年前

    我也犯了同样的错误,不得不删除 ObjectMapper().readValue(request.getInputStream(),ApplicationUser.class);

    并直接使用request.getParameter:

                    new UsernamePasswordAuthenticationToken(
                        request.getParameter("username"),
                        request.getParameter("password"),
                        Collections.emptyList()
                )