繁体   English   中英

JBoss登录Web应用程序错误-无法解析请求。java.lang.IllegalArgumentException:查询中的非法字符

[英]JBoss Login Web Application error - Failed to parse request.: java.lang.IllegalArgumentException: Illegal character in query

我正在尝试开发一个登录系统,并且遵循了Ticketmonster的结构。 仅在登录后才填写main.html中的菜单容器,并且内容将使用登录模板填充,路由器将立即在其中呈现登录视图,并应用该模板。 单击登录按钮后,将创建一个Ajax请求并将其发送到其服务。

  • 这是登录视图中的登录功能:

`

login:function(){

  var username = $("#username");
  var password = $("#password");

  var userLoginRequest = {username:username.val(), password:password.val()};

  $.ajax({url: (config.baseUrl + "rest/users"),
          data:JSON.stringify(userLoginRequest),
          type:"GET",
          dataType:"json",
          contentType:"application/json",
          success:function (userId) {
            alert(userId);
          }}).error(function (error) {
    if (error.status == 400 || error.status == 409) {
      var errors = $.parseJSON(error.responseText).errors;
      _.each(errors, function (errorMessage) {
        $("#error").empty().append(errorMessage);
      });
    } else {
      $("#error").empty().append("An error has occurred!");
    }
  });

}
  • 这就是服务。 更改为@Consumes会得到相同的结果。

`

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response authenticateUser(UserLoginRequest userLoginRequest){
  User user = serviceUtility.getUserFromUsername(userLoginRequest.getUsername());

  if (user == null){
    return serviceUtility.badRequestResponse("No users with this username exist!");
  } else if (!user.getPassword().equals(userLoginRequest.getPassword())) {
    return serviceUtility.badRequestResponse("Incorrect Password!");
  } else {
    return Response.ok().entity(user.getId()).type(MediaType.APPLICATION_JSON_TYPE).build();
  }
}
  • 这是服务器错误。 经过一些研究,我认为这可能是转义字符串问题,但是我没有看到它应用于TicketMonster代码,也没有在本教程中讨论。

WARN [org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher](http-localhost / 127.0.0.1:8180-6)无法解析请求。java.lang.IllegalArgumentException:索引38处查询中的非法字符:localhost :8180 / MCC2 / rest / users?{%22username%22:%22wakas%22,%22password%22:%22Password%22}&_ = 1426754780833 at java.net.URI.create(URI.java:859)[rt .jar:1.7.0_03] ...

  • 这是Firebug上的错误

GET localhost:8180 / MCC2 / rest / users?{%22usernam ... 2,%22password%22:%22Password%22}& = 1426757495550 400 Bad Request 19ms
jquery-2.0.3.js(第7845行)“ NetworkError:400错误请求-localhost:8180 / MCC2 / rest / users?{%22username%22:%22User%20Name%22,%22password%22:%22Password%22 }& = 1426757495550“用户?{... 7495550 SyntaxError:JSON.parse:JSON数据login.js的第1行第1列的意外字符(第49行,col 41)var错误= $ .parseJSON(error.responseText) 。错误;

  • 将Ajax请求的类型以及服务上的注释切换为POST,在服务器上不会发生任何错误,但是在Firebug中会出现以下错误。

POST localhost:8180 / MCC2 / rest / users 405方法不允许8ms jquery-2.0.3.js(第7845行)“ NetworkError:405方法不允许-localhost:8180 / MCC2 / rest / users”

  • 我已经在服务的开始处放置了一个断点,并且在任何情况下,都不会输入该服务。

更新:尽管我用GET请求编写了这篇文章,但我认为它应该是POST请求,在这种情况下,问题可能是Firebug错误的原因。

另外,部署我的应用程序时出现以下错误:原因:org.hibernate.MappingException:无法确定类型:java.util.Set,在表:User,对于列:[org.hibernate.mapping。列(userListIds)]

这是用户(不包括设置器和获取器):

`

@SuppressWarnings("serial")
@Entity
public class User implements Serializable {

@Id
@GeneratedValue
private Long id;

@NotNull
@Size(min = 5, max = 16)
@Pattern(regexp = "[a-zA-Z0-9_]*", message = "Must only contain small and capital letters, numbers, and underscore!")
@Column(unique=true)
private String username;

@NotNull
@Size(min = 5, max = 16)
private String password;

@NotNull
@Size(min = 1, max = 25)
@Pattern(regexp = "[^0-9]*", message = "Must not contain numbers")
private String firstName;

@NotNull
@Size(min = 1, max = 25)
@Pattern(regexp = "[^0-9]*", message = "Must not contain numbers")
private String lastName;

@NotNull
@Column(unique = true)
@NotEmpty
@Email(message = "Not a valid email format")
private String email;

@Size(min = 10, max = 12)
@Digits(fraction = 0, integer = 12)
private String phoneNumber;

@Size(min = 1, max = 300)
private String description;

//  @NotNull <--commented since we don't have a setter
private Date creationDate = new Date();

@NotNull
private Role role = Role.MEMBER;

@NotNull
private boolean enabled = true;

private Set<Long> userListIds = new HashSet<Long>();

public void addUserToUserlist(Long newUserId){
    userListIds.add(newUserId);
}

public void removeUserFromUserlist(Long newUserId){
    userListIds.remove(newUserId);
}

public Set<Long> getUserListIds() {
    return userListIds;
}

public void setUserListIds(Set<Long> userListIds) {
    this.userListIds = userListIds;
}

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 String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public Date getCreationDate() {
    return creationDate;
}

//  public void setCreationDate(Date creationDate) {
//      this.creationDate = creationDate;
//  }

public Role getRole() {
    return role;
}

public void setRole(Role role) {
    this.role = role;
}

public boolean isEnabled() {
    return enabled;
}

public void setEnabled(boolean enabled) {
    this.enabled = enabled;
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String name) {
    this.firstName = name;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getPhoneNumber() {
    return phoneNumber;
}

public void setPhoneNumber(String phoneNumber) {
    this.phoneNumber = phoneNumber;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((id == null) ? 0 : id.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    User other = (User) obj;
    if (id == null) {
        if (other.id != null)
            return false;
    } else if (!id.equals(other.id))
        return false;
    return true;
}

@Override
public String toString() {
    return "User [username=" + username + ", firstName=" + firstName
            + ", lastName=" + lastName + ", email=" + email
            + ", phoneNumber=" + phoneNumber + ", creationDate="
            + creationDate + ", role=" + role + ", enabled=" + enabled
            + "]";
}

}

我认为这条线:

data:JSON.stringify(userLoginRequest)

相反应该是

data:encodeURIComponent(JSON.stringify(userLoginRequest))

因为您需要对查询字符串中发送的所有数据进行URL编码。 JSONification可能会产生需要在网络上发送之前进行编码的字符,否则服务器可能会遇到解析问题,这种情况就是这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM